#ifndef GUA_H
#define GUA_H

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <limits>
#include <string>
#include <vector>

// 基本类型和修饰符
#define 结构 struct
#define 类 class
#define 函数 void
#define 整数 int
#define 布尔 bool
#define 字符串 std::string
#define 向量 std::vector
#define 常量 const
#define 静态 static
#define 空 nullptr

// 控制流
#define 开始 {
#define 结束 }
#define 如果 if
#define 否则 else
#define 当 while
#define 对于 for
#define 开关 switch
#define 案例 case
#define 跳出 break
#define 继续 continue
#define 返回 return

// 访问修饰符
#define 公开 public
#define 私有 private
#define 保护 protected

// 输入输出
#define 输出 std::cout
#define 输入 std::cin
#define 换行 std::endl

// 项目特定
#define 卦 gua
#define 爻辞 line_text
#define 名称 name
#define 描述 description
#define 初始化 initialize
#define 生成 generate
#define 显示 display
#define 自动 auto

// 定义易经卦象信息结构体
结构 易经卦象信息 开始 字符串 名称;
字符串 描述;
向量<字符串> 爻辞;
字符串 详细描述;
结束;

// 预定义卦象列表
常量 向量<易经卦象信息> 易经卦象列表 = {
    {"乾卦",
     "元，亨，利，贞。",
     {"初九：潜龙，勿用。", "九二：见龙在田，利见大人。",
      "九三：君子终日乾乾，夕惕若厉，无咎。", "九四：或跃在渊，无咎。",
      "九五：飞龙在天，利见大人。", "上九：亢龙，有悔。"},
     "乾卦代表天，象征刚健、积极、创造。体现了天道的运行规律，君子应效法天道，"
     "自强不息。"},
    {"坤卦",
     "元亨，利牝马之贞。君子有攸往，先迷后得主，利西南得朋，东北丧朋。安贞，吉"
     "。",
     {"初六：履霜，坚冰至。", "六二：直方大，不习无不利。",
      "六三：含章可贞。或从王事，无成有终。", "六四：括囊，无咎无誉。",
      "六五：黄裳，元吉。", "上六：龙战于野，其血玄黄。"},
     "坤卦代表地，象征柔顺、承载、包容。寓意着大地的宽厚与慈爱，君子应效法大地"
     "，厚德载物。"},
    {"屯卦",
     "元亨，利贞，勿用有攸往，利建侯。",
     {"初九：磐桓，利居贞，利建侯。",
      "六二：屯如邅如，乘马班如。匪寇婚媾，女子贞不字，十年乃字。",
      "六三：即鹿无虞，惟入于林中，君子几不如舍，往吝。",
      "六四：乘马班如，求婚媾，往吉，无不利。",
      "九五：屯其膏，小贞吉，大贞凶。", "上六：乘马班如，泣血涟如。"},
     "屯卦象征事物初创时的艰难与希望。此时应坚守正道，稳步发展，不可冒进。"},
    {"蒙卦",
     "亨。匪我求童蒙，童蒙求我。初筮告，再三渎，渎则不告。利贞。",
     {"初六：发蒙，利用刑人，用说桎梏，以往吝。",
      "九二：包蒙吉；纳妇吉；子克家。",
      "六三：勿用取女，见金夫，不有躬，无攸利。", "六四：困蒙，吝。",
      "六五：童蒙，吉。", "上九：击蒙，不利为寇，利御寇。"},
     "蒙卦代表蒙昧、幼稚，但也蕴含着启蒙、教育的契机。强调要及时开启智慧，引导"
     "成长。"},
    {"需卦",
     "有孚，光亨，贞吉。利涉大川。",
     {"初九：需于郊。利用恒，无咎。", "九二：需于沙。小有言，终吉。",
      "九三：需于泥，致寇至。", "六四：需于血，出自穴。",
      "九五：需于酒食，贞吉。", "上六：入于穴，有不速之客三人来，敬之终吉。"},
     "需卦意味着等待、期待。在面临困难时，要耐心等待时机，不可急躁冒进。"},
    {"讼卦",
     "有孚，窒。 惕中吉，终凶。 利见大人，不利涉大川。",
     {"初六：不永所事，小有言，终吉。",
      "九二：不克讼，归而逋，其邑人三百户，无眚。",
      "六三：食旧德，贞厉，终吉，或从王事，无成。",
      "九四：不克讼，复即命，渝安贞，吉。", "九五：讼元吉。",
      "上九：或锡之鞶带，终朝三褫之。"},
     "讼卦代表争讼、纠纷。告知人们要尽量避免纷争，若不可避免，也要秉持公正，适"
     "可而止。"},
    {"师卦",
     "贞，丈人，吉无咎。",
     {"初六：师出以律，否臧凶。", "九二：在师中，吉无咎，王三锡命。",
      "六三：师或舆尸，凶。", "六四：师左次，无咎。",
      "六五：田有禽，利执言，无咎。长子帅师，弟子舆尸，贞凶。",
      "上六：大君有命，开国承家，小人勿用。"},
     "师卦象征军队、战争。强调行军作战要纪律严明，任用贤能，不可滥用武力。"},
    {"比卦",
     "吉。原筮，元永贞，无咎。不宁方来，后夫凶。",
     {"初六：有孚比之，无咎。有孚盈缶，终来有它，吉。",
      "六二：比之自内，贞吉。", "六三：比之匪人。", "六四：外比之，贞吉。",
      "九五：显比，王用三驱，失前禽。邑人不诫，吉。", "上六：比之无首，凶。"},
     "比卦表示亲密、团结。倡导人们相互亲附、合作，共同发展，但要选择合适的伙伴"
     "。"}};

// 定义卦结构
结构 卦 开始 公开 : 卦() 开始 初始化();
结束

函数 初始化() 开始 静态 布尔 已初始化 = false;
如果(!已初始化) 开始 srand(static_cast<unsigned>(time(空)));
已初始化 = true;
结束
爻辞.resize(6);
详细爻辞.resize(6);
结束

函数 生成() 开始 如果(易经卦象列表.empty()) 开始 输出 << "错误：卦象列表为空！"
                                                      << 换行;
返回;
结束

整数 随机索引 = rand() % 易经卦象列表.size();
常量 易经卦象信息& 选定卦象 = 易经卦象列表[随机索引];

名称 = 选定卦象.名称;
描述 = 选定卦象.描述;
详细爻辞 = 选定卦象.爻辞;
详细描述 = 选定卦象.详细描述;

对于(自动& 爻 : 爻辞) 开始 爻 = (rand() % 2) ? "———" : "— —";
结束
结束

字符串 名称;
字符串 描述;
向量<字符串> 爻辞;
向量<字符串> 详细爻辞;
字符串 详细描述;
结束;

// 定义卦控制器结构
结构 卦控制器 开始 公开 : 卦控制器()
    : 运行中(true) 开始 结束

      函数 运行() 开始 显示欢迎信息();
当前卦.初始化();

当(运行中) 开始 显示菜单();
处理输入();
结束
结束

私有 : 卦 当前卦;
布尔 运行中;

函数 清理输入() 开始 输入.clear();
输入.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
结束

函数 显示欢迎信息() 开始 输出 << "\n====================" << 换行;
输出 << "    易经卦象系统" << 换行;
输出 << "====================" << 换行;
结束

函数 显示菜单() 开始 输出 << "\n1. 生成新卦" << 换行;
输出 << "2. 退出系统" << 换行;
输出 << "\n请选择 (1-2): ";
结束

函数 显示卦象() 开始 输出 << "\n━━━━━━━━━━━━━━━━━━" << 换行;
输出 << "卦名: " << 当前卦.名称 << 换行;
输出 << "卦辞: " << 当前卦.描述 << 换行;
输出 << "\n详细描述: " << 当前卦.详细描述 << 换行;
输出 << "\n━━━━ 爻辞详解 ━━━━" << 换行;

对于(整数 i = 0; i < 6; ++i)
开始 输出 << "第" << i + 1 << "爻: " << 当前卦.爻辞[i] << "\n    "
          << 当前卦.详细爻辞[i] << 换行;
结束
输出 << "━━━━━━━━━━━━━━━━━━" << 换行;
结束

函数 处理输入() 开始 字符串 输入行;
getline(输入, 输入行);

如果(输入行.empty()) 开始 显示菜单();
返回;
结束

如果(输入行.length() == 1) 开始 开关(输入行[0]) 开始 案例 '1' : 当前卦.生成();
显示卦象();
输出 << "\n按回车继续...";
getline(输入, 输入行);
跳出;
案例 '2' : 运行中 = false;
输出 << "\n感谢使用，再见！\n" << 换行;
跳出;
案例 '0' : 默认 : 输出 << "\n请输入有效的选项 (1 或 2)" << 换行;
显示菜单();
跳出;
结束
结束
结束
结束;

#endif  // GUA_H